package com.jie.common.controller;

import com.jie.common.result.R;
import org.springframework.http.ResponseEntity;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

/**
 * @description: 上传文件前端控制器
 * @author: xiaojie
 * @since: 2025/1/2 0002
 */
@RestController
@RequestMapping("/file")
public class UploadController {

    private static final String UPLOAD_DIR = "/uploads/";

    /**
     *
     * @param file  上传的文件
     * @param start 文件开始上传的位置
     * @param fileName 上传的文件名
     * @return
     */
    @PostMapping("/upload2")
    public ResponseEntity<String> resumeUpload(@RequestParam("file") MultipartFile file, @RequestParam("start") long start, @RequestParam("fileName") String fileName) {
        try {
            File directory = new File(UPLOAD_DIR);
            if (!directory.exists()) {
                directory.mkdirs();
            }
            File targetFile = new File(UPLOAD_DIR + fileName);
            RandomAccessFile randomAccessFile = new RandomAccessFile(targetFile, "rw");
            FileChannel channel = randomAccessFile.getChannel();
            channel.position(start);
            channel.transferFrom(file.getResource().readableChannel(), start, file.getSize());
            channel.close();
            randomAccessFile.close();
            return ResponseEntity.ok("上传成功");
        } catch (Exception e) {
            System.out.println("上传失败: "+e.getMessage());
            return ResponseEntity.status(500).body("上传失败");
        }
    }

    @PostMapping("upload")
    public R uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return R.error("文件不存在");
        }
        try {
            // 将文件保存到本地
            File dastinationFile = new File(UPLOAD_DIR + file.getOriginalFilename());
            file.transferTo(dastinationFile);
            return R.ok("上传成功");
        } catch (IOException e) {
            e.printStackTrace();
            return R.error("上传失败");
        }
    }


     @PostMapping
     public String uploadFiles(@RequestParam("file") MultipartFile file) {
         try {

            if (file.isEmpty()) {
                 return "文件为空,请重新选择!";
            }
             // 上传的图片
            File path = new File(UPLOAD_DIR);
            if (!path.exists()) {
                // 创建完整的目录
                path.mkdirs();
            }
            // 获取文件原始名(包含后缀名)
            String originalName = file.getOriginalFilename();
            // 获取文件名（不包括后缀）
            String prefixName = originalName.substring(0, originalName.lastIndexOf("."));
            // 获取文件后缀 （包括.） 例如：.png
            String suffixName = originalName.substring(originalName.lastIndexOf("."));
            // 这是处理后的新文件名
            String fileName;
            if (originalName.contains(".")) {
                // 示例：avatar.123.png，经过处理后得到：avatar.123_1661136943533.png
                fileName = prefixName + "_" + System.currentTimeMillis() + suffixName;
            } else {
                return "上传图片格式错误,请重新选择！";
            }

            String savePath = path.getPath() + File.separator + fileName;

            File saveFile = new File(savePath);
            // 将上传的文件复制到指定目录
            FileCopyUtils.copy(file.getBytes(), saveFile);
            // 返回给前端的图片保存路径；前台可以根据返回的路径拼接完整地址，即可在浏览器上预览该图片
            String dest = "images" + File.separator + fileName;

            return dest;
          } catch (IOException e) {
            return e.getMessage();
          }
    }

}
